home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / libsrc~1.z / libsrc~1 / signal.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-28  |  1.4 KB  |  55 lines

  1. #include "lib.h"
  2. #include <signal.h>
  3.  
  4. void (*vectab[_NSIG])();    /* array of functions to catch signals */
  5.  
  6. /* The definition of signal really should be 
  7.  *  PUBLIC int (*signal(signr, func))()
  8.  * but some compilers refuse to accept this, even though it is correct.
  9.  * The only thing to do if you are stuck with such a defective compiler is
  10.  * change it to
  11.  *  PUBLIC int *signal(signr, func)
  12.  * and change ../h/signal.h accordingly.
  13.  */
  14.  
  15. #ifdef __STDC__
  16. PUBLIC void (*signal(signr, func))()
  17. int signr;            /* which signal is being set */
  18. void (*func)();            /* pointer to function that catches signal */
  19. #else
  20. PUBLIC int (*signal(signr, func))()
  21. int signr;            /* which signal is being set */
  22. int (*func)();            /* pointer to function that catches signal */
  23. #endif
  24. {
  25.   int r;
  26. #ifdef __STDC__
  27.   void (*old)();
  28. #else
  29.   int (*old)();
  30. #endif
  31.   old = vectab[signr - 1];
  32.   M.m6_i1 = signr;
  33.   if (func == SIG_IGN || func == SIG_DFL)
  34.     /* keep old signal catcher until it is completely de-installed */
  35.     M.m6_f1 = func;
  36.   else {
  37.     /* use new signal catcher immediately (old one may not exist) */
  38.     vectab[signr - 1] = func;
  39.     M.m6_f1 = begsig;
  40.   }
  41.   r = callx(MM, SIGNAL);
  42.   if (r < 0) {
  43.     vectab[signr - 1] = old;    /* undo any pre-installation */
  44. #ifdef __STDC__
  45.     return( (void (*)()) r );
  46. #else
  47.     return( (int (*)()) r );
  48. #endif
  49.   }
  50.   vectab[signr - 1] = func;        /* redo any pre-installation */
  51.   if (r == 1)
  52.     return(SIG_IGN);
  53.   return(old);
  54. }
  55.